package models

import (
	"log"
	"strconv"
	"time"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

// FileModel File实体
type FileModel struct {
	ID          uint           `gorm:"primaryKey;autoIncrement"`
	Name        string         `gorm:"size:255;not null;comment:原始文件名"`
	SaveName    string         `gorm:"size:255;not null;comment:存储文件名"`
	SavePath    string         `gorm:"size:500;not null;comment:存储路径"`
	Ext         string         `gorm:"size:50;comment:文件扩展名"`
	MimeType    string         `gorm:"size:100;comment:文件MIME类型"`
	Size        int64          `gorm:"comment:文件大小(字节)"`
	Md5         string         `gorm:"size:40;comment:文件MD5"`
	Sha256      string         `gorm:"size:40;comment:文件SHA256"`
	StorageType string         `gorm:"default:0;comment:存储类型(0:本地 1:七牛云 2:又拍云)"`
	CreatorID   uint           `gorm:"index;comment:上传用户ID"`
	DeptID      uint           `gorm:"index;comment:部门ID"`
	CreatedAt   time.Time      `gorm:"autoCreateTime"`
	UpdatedAt   time.Time      `gorm:"autoUpdateTime"`
	DeletedAt   gorm.DeletedAt `gorm:"index"`
}

// FileDto 文件传输对象
type FileDto struct {
	ID          uint   `json:"id"`
	Name        string `json:"name"`
	SaveName    string `json:"save_name"`
	SavePath    string `json:"save_path"`
	Ext         string `json:"ext"`
	MimeType    string `json:"mime_type"`
	Size        int64  `json:"size"`
	Md5         string `json:"md5"`
	Sha256      string `json:"sha256"`
	StorageType string `json:"storage_type"`
	CreatorID   uint   `json:"creator_id"`
	DeptID      uint   `json:"dept_id"`
	CreatedAt   string `json:"created_at"`
	UpdatedAt   string `json:"updated_at"`
}

// ToDto 将FileModel转换为FileDto
func (f *FileModel) ToDto() *FileDto {
	return &FileDto{
		ID:          f.ID,
		Name:        f.Name,
		SaveName:    f.SaveName,
		SavePath:    f.SavePath,
		Ext:         f.Ext,
		MimeType:    f.MimeType,
		Size:        f.Size,
		Sha256:      f.Sha256,
		StorageType: f.StorageType,
	}
}

// TableName 指定表名
func (FileModel) TableName() string {
	return "files" // 返回您想要的表名
}

// BeforeCreate 钩子函数，在创建前设置创建人ID和部门IDc
func (c *FileModel) BeforeCreate(db *gorm.DB) error {
	type User struct {
		ID       uint   `json:"id" gorm:"primaryKey;autoIncrement"`
		Username string `json:"username" gorm:"size:100;not null;uniqueIndex;comment:用户名"`
		DeptID   int    `json:"dept_id" gorm:"column:dept_id;index;comment:部门ID"`
	}

	// 1. 从GORM上下文中获取gin.Context
	ctx, ok := db.Statement.Context.Value("ginContext").(*gin.Context)
	if !ok {
		log.Println("[FileModel] 错误：无法获取gin.Context")
		return nil
	}
	// 将从上下文获取的 userID 字符串转换为 uint 类型
	var UserID uint
	if idStr, ok := ctx.Get("userID"); ok {
		if idStrStr, ok := idStr.(string); ok {
			var err error
			parsedID, err := strconv.ParseUint(idStrStr, 10, 64)
			UserID = uint(parsedID)
			if err != nil {
				log.Printf("[FileModel] 转换 userID 为 uint 类型失败: %v", err)
			}
		}
	}
	c.CreatorID = UserID
	log.Printf("[FileModel] 已设置 CreatorID: %v", UserID)

	// 4. 查询部门ID
	var deptID uint
	if err := db.Model(User{}).
		Where("id = ?", UserID).
		Select("dept_id").
		First(&deptID).Error; err != nil {
		log.Printf("[FileModel] 查询部门ID失败: %v", err)
		return nil
	}

	c.DeptID = deptID
	return nil
}
